/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.gestion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import co.gov.medellin.sdep.sisdep.gestion.exception.ArticuloAreaResponsableException;
import co.gov.medellin.sdep.sisdep.gestion.exception.ArticuloException;
import co.gov.medellin.sdep.sisdep.gestion.exception.ArticuloGrupoException;
import co.gov.medellin.sdep.sisdep.gestion.exception.ArticuloRuntimeException;
import co.gov.medellin.sdep.sisdep.gestion.exception.ArticuloSubGrupoException;
import co.gov.medellin.sdep.sisdep.gestion.service.IArticuloAreaResponsableService;
import co.gov.medellin.sdep.sisdep.gestion.service.IArticuloGrupoService;
import co.gov.medellin.sdep.sisdep.gestion.service.IArticuloService;
import co.gov.medellin.sdep.sisdep.gestion.service.IArticuloSubGrupoService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.model.Articulo;
import co.gov.medellin.sdep.sisdep.model.ArticuloAreaResponsable;
import co.gov.medellin.sdep.sisdep.model.ArticuloGrupo;
import co.gov.medellin.sdep.sisdep.model.ArticuloSubGrupo;

/**
 * @author Usuario
 * 
 */
public class ArticuloController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public ArticuloController() {
		cleanSearchValues();
		cleanValues();
	}

	/** bean para el manejo del formulario de busqueda Articulo */
	private Articulo articuloSearch = new Articulo();

	/** Objeto contenedor del listado de Articulo luego de una consulta. */
	private DataModel articuloListModel;

	/** bean para el manejo del formulario de creacion/edicion. Articulo */
	private Articulo articulo = new Articulo();

	/** instancia de servicio articuloService */
	private IArticuloService articuloService;
	
	/** instancia de servicio articuloGrupoService */
	private IArticuloGrupoService articuloGrupoService;

	/** instancia de servicio articuloSubGrupoService */
	private IArticuloSubGrupoService articuloSubGrupoService;

	/** instancia de servicio articuloSubGrupoService */
	private IArticuloAreaResponsableService articuloAreaResponsableService;

	/** instancia del item articulo grupo Seleccionado */
	private String articuloGrupoSelectedItem;
	
	/** listado de items para cargar el combo de articulos grupo */
	private List articuloGrupoSelectItems = new ArrayList();
	
	/** instancia del item articulo grupo Seleccionado */
	private String articuloSubGrupoSelectedItem;
	
	/** listado de items para cargar el combo de articulos grupo */
	private List articuloSubGrupoSelectItems = new ArrayList();
	
	/** parametro ajax para consultar los sub grupos en combo dinamico */
	private String itemGrupo;
	
	/** instancia del item articulo area responsable Seleccionado */
	private String articuloAreaResponsableSelectedItem;
	
	/** listado de items para cargar el combo de articulos area responsable */
	private List articuloAreaResponsableSelectItems = new ArrayList();

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	public void loadListItemsAriculoGrupo(){
		try {
			articuloGrupoSelectItems = new ArrayList();
			List articuloGrupos = getArticuloGrupoService().loadMasterListItems();
			if(articuloGrupos != null && articuloGrupos.size() > 0){
				Iterator it = articuloGrupos.iterator();
				while (it.hasNext()) {
					ArticuloGrupo articuloGrupoLocal = (ArticuloGrupo) it.next();
					articuloGrupoSelectItems.add(new SelectItem(""+articuloGrupoLocal.getId(), articuloGrupoLocal.getCodigo() + " - " + articuloGrupoLocal.getNombre()));
				}
			}
		} catch (ArticuloGrupoException e) {
			e.printStackTrace(System.err);
		}		
	}

	public void loadListItemsAriculoSubGrupo(){
		try {
			List articuloSubGrupos = getArticuloSubGrupoService().loadMasterListItems(Long.valueOf((getItemGrupo().equals("")?"0":getItemGrupo())).longValue());
			if(articuloSubGrupos != null && articuloSubGrupos.size() > 0){
				Iterator it = articuloSubGrupos.iterator();
				while (it.hasNext()) {
					ArticuloSubGrupo articuloSubGrupoLocal = (ArticuloSubGrupo) it.next();
					articuloSubGrupoSelectItems.add(new SelectItem(""+articuloSubGrupoLocal.getId(), articuloSubGrupoLocal.getCodigo() + " - " + articuloSubGrupoLocal.getNombre()));
				}
			}
		} catch (ArticuloSubGrupoException e) {
			e.printStackTrace(System.err);
		} catch (NumberFormatException e) {
			e.printStackTrace(System.err);
		}		
	}
	
	public void loadListItemsAriculoAreaResponsable(){
		try {
			articuloAreaResponsableSelectItems = new ArrayList();
			List articuloAreaResponsableSelectItemsLocal = getArticuloAreaResponsableService().loadMasterListItems();
			if(articuloAreaResponsableSelectItemsLocal != null && articuloAreaResponsableSelectItemsLocal.size() > 0){
				Iterator it = articuloAreaResponsableSelectItemsLocal.iterator();
				while (it.hasNext()) {
					ArticuloAreaResponsable articuloAreaResponsableLocal = (ArticuloAreaResponsable) it.next();
					articuloAreaResponsableSelectItems.add(new SelectItem(""+articuloAreaResponsableLocal.getId(), articuloAreaResponsableLocal.getAreaResponsable() + " - " + articuloAreaResponsableLocal.getObservacion()));
				}
			}
		} catch (ArticuloAreaResponsableException e) {
			e.printStackTrace(System.err);
		} catch (NumberFormatException e) {
			e.printStackTrace(System.err);
		}		
	}

	public String checkSubGrupos(){
		setArticuloSubGrupoSelectItems(new ArrayList());
		loadListItemsAriculoSubGrupo();		
		return "";
	}
	/**
	 * 
	 * @return String
	 */
	public String initState() {
		cleanSearchValues();
		cleanValues();
		return AppConstants.ARTICULO_INIT_VIEW;
	}

	/**
	 * 
	 * @return String
	 */
	public String searchArticuloByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getArticuloService().load(1, 10,
					this.articuloSearch);
			this.articuloListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.articuloListModel.getWrappedData() == null) {
			if(msg.equals("")){
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		} else {
			if (((List) this.articuloListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		cleanSearchValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.ARTICULO_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.articulo.getId().longValue() == 0L) {
				getArticuloService().insert(this.articulo);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (ArticuloException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (ArticuloRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Art\u00EDculo " + msg, null, null);
		return AppConstants.ARTICULO_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.articulo.getId().longValue() != 0L) {
				getArticuloService().update(this.articulo);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (ArticuloException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (ArticuloRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Art\u00EDculo " + msg, null, null);
		return AppConstants.ARTICULO_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createArticulo() {
		articulo = new Articulo();
		cleanValues();
		loadListItemsAriculoGrupo();
		loadListItemsAriculoAreaResponsable();
		return AppConstants.ARTICULO_CREATE_VIEW;
	}

	/**
	 * 
	 */
	public String searchGrupoArticulo() {
		cleanSearchValues();
		cleanValues();
		return AppConstants.ARTICULO_SEARCH_GRUPO_VIEW;
	}
	
	/**
	 * 
	 * @return
	 */
	public String updateArticulo() {
		Map params = getExternalContext().getRequestParameterMap();
		String articuloDataIndex = (String) params
				.get("articuloDataIndex");
		this.articulo = (Articulo) ((List) this.articuloListModel
				.getWrappedData())
				.get(Integer.parseInt(articuloDataIndex));
		cleanSearchValues();
		//Cargamos la lista desplegable de grupo de articulos
		loadListItemsAriculoGrupo();
		//Cargamos la lista desplegable de sub grupo de articulos relacionados
		setItemGrupo(String.valueOf(this.articulo.getArticuloSubGrupo().getIdArticuloGrupo()));
		loadListItemsAriculoSubGrupo();
		loadListItemsAriculoAreaResponsable();
		return AppConstants.ARTICULO_UPDATE_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelArticulo() {
		cleanSearchValues();
		return AppConstants.ARTICULO_SEARCH_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelArticuloOpcion() {
		cleanValues();
		cleanSearchValues();
		return AppConstants.ARTICULO_SEARCH_VIEW;
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues(){
		articuloSearch.setCodigo("");
		articuloSearch.setDescripcion("");
		articuloSearch.setEstado("");
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues(){
		articulo.setId(new Long(0L));
		articulo.setCodigo("");
		articulo.setDescripcion("");
		articulo.setDescripcionAdicional("");
		articulo.setIdUnidadMedida(new Long(0L));
		articulo.setPeso(new Long(0L));
		articulo.setVolumen(new Long(0L));
		articulo.setIdSubGrupoArticulo(new Long(0L));
		articulo.setIdAreaResponsable(new Long(0L));
		articulo.setValorUnitario(new Long(0L));
		articulo.setIdUnidadMedidaCompra(new Long(0L));
		articulo.setDescripcionCompra("");
		articulo.setIdTipoMaterial(new Long(0L));
		articulo.setPropio("");
		articulo.setEstado("");
		this.articuloListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public Articulo getArticuloSearch() {
		return articuloSearch;
	}

	/**
	 * 
	 * @param articuloSearch
	 */
	public void setarticuloSearch(Articulo articuloSearch) {
		this.articuloSearch = articuloSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getarticuloListModel() {
		return articuloListModel;
	}

	/**
	 * 
	 * @param articuloListModel
	 */
	public void setarticuloListModel(DataModel articuloListModel) {
		this.articuloListModel = articuloListModel;
	}

	/**
	 * 
	 * @return
	 */
	public Articulo getArticulo() {
		return articulo;
	}

	/**
	 * 
	 * @param articulo
	 */
	public void setarticulo(Articulo articulo) {
		this.articulo = articulo;
	}

	/**
	 * obtencion del servicio articuloService
	 * 
	 * @return
	 */
	public IArticuloService getArticuloService() {
		return articuloService;
	}

	/**
	 * establecimiento del servicio articuloService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param articuloService
	 */
	public void setArticuloService(
			IArticuloService articuloService) {
		this.articuloService = articuloService;
	}

	public IArticuloGrupoService getArticuloGrupoService() {
		return articuloGrupoService;
	}

	public void setArticuloGrupoService(IArticuloGrupoService articuloGrupoService) {
		this.articuloGrupoService = articuloGrupoService;
	}

	public IArticuloSubGrupoService getArticuloSubGrupoService() {
		return articuloSubGrupoService;
	}

	public void setArticuloSubGrupoService(
			IArticuloSubGrupoService articuloSubGrupoService) {
		this.articuloSubGrupoService = articuloSubGrupoService;
	}

	public String getArticuloGrupoSelectedItem() {
		return articuloGrupoSelectedItem;
	}

	public void setArticuloGrupoSelectedItem(String articuloGrupoSelectedItem) {
		this.articuloGrupoSelectedItem = articuloGrupoSelectedItem;
	}

	public List getArticuloGrupoSelectItems() {
		return articuloGrupoSelectItems;
	}

	public void setArticuloGrupoSelectItems(List articuloGrupoSelectItems) {
		this.articuloGrupoSelectItems = articuloGrupoSelectItems;
	}

	public String getArticuloSubGrupoSelectedItem() {
		return articuloSubGrupoSelectedItem;
	}

	public void setArticuloSubGrupoSelectedItem(String articuloSubGrupoSelectedItem) {
		this.articuloSubGrupoSelectedItem = articuloSubGrupoSelectedItem;
	}

	public List getArticuloSubGrupoSelectItems() {
		return articuloSubGrupoSelectItems;
	}

	public void setArticuloSubGrupoSelectItems(List articuloSubGrupoSelectItems) {
		this.articuloSubGrupoSelectItems = articuloSubGrupoSelectItems;
	}

	public String getItemGrupo() {
		return itemGrupo;
	}

	public void setItemGrupo(String itemGrupo) {
		this.itemGrupo = itemGrupo;
	}

	public String getArticuloAreaResponsableSelectedItem() {
		return articuloAreaResponsableSelectedItem;
	}

	public void setArticuloAreaResponsableSelectedItem(
			String articuloAreaResponsableSelectedItem) {
		this.articuloAreaResponsableSelectedItem = articuloAreaResponsableSelectedItem;
	}

	public List getArticuloAreaResponsableSelectItems() {
		return articuloAreaResponsableSelectItems;
	}

	public void setArticuloAreaResponsableSelectItems(
			List articuloAreaResponsableSelectItems) {
		this.articuloAreaResponsableSelectItems = articuloAreaResponsableSelectItems;
	}

	public IArticuloAreaResponsableService getArticuloAreaResponsableService() {
		return articuloAreaResponsableService;
	}

	public void setArticuloAreaResponsableService(
			IArticuloAreaResponsableService articuloAreaResponsableService) {
		this.articuloAreaResponsableService = articuloAreaResponsableService;
	}
		
	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
